package com.uniflow.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.uniflow.entity.TaskCenter;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 任务中心数据访问层
 */
@Mapper
public interface TaskCenterMapper extends BaseMapper<TaskCenter> {
    
    /**
     * 分页查询任务列表
     */
    IPage<TaskCenter> selectTaskPage(Page<TaskCenter> page,
                                    @Param("title") String title,
                                    @Param("type") String type,
                                    @Param("category") String category,
                                    @Param("status") String status,
                                    @Param("priority") Integer priority,
                                    @Param("assigneeId") String assigneeId,
                                    @Param("createdBy") String createdBy,
                                    @Param("businessType") String businessType,
                                    @Param("processInstanceId") String processInstanceId,
                                    @Param("formId") String formId,
                                    @Param("startDate") LocalDateTime startDate,
                                    @Param("endDate") LocalDateTime endDate,
                                    @Param("overdue") Boolean overdue,
                                    @Param("tags") String tags);
    
    /**
     * 根据执行人查询任务列表
     */
    List<TaskCenter> selectByAssigneeId(@Param("assigneeId") String assigneeId,
                                       @Param("status") String status);
    
    /**
     * 根据创建人查询任务列表
     */
    List<TaskCenter> selectByCreatedBy(@Param("createdBy") String createdBy,
                                      @Param("status") String status);
    
    /**
     * 根据业务键查询任务
     */
    TaskCenter selectByBusinessKey(@Param("businessKey") String businessKey);
    
    /**
     * 根据流程实例ID查询任务列表
     */
    List<TaskCenter> selectByProcessInstanceId(@Param("processInstanceId") String processInstanceId);
    
    /**
     * 根据流程任务ID查询任务
     */
    TaskCenter selectByProcessTaskId(@Param("processTaskId") String processTaskId);
    
    /**
     * 根据表单ID查询任务列表
     */
    List<TaskCenter> selectByFormId(@Param("formId") String formId);
    
    /**
     * 根据表单数据ID查询任务
     */
    TaskCenter selectByFormDataId(@Param("formDataId") String formDataId);
    
    /**
     * 查询我的任务列表
     */
    IPage<TaskCenter> selectMyTasks(Page<TaskCenter> page,
                                   @Param("userId") String userId,
                                   @Param("status") String status,
                                   @Param("type") String type,
                                   @Param("priority") Integer priority,
                                   @Param("overdue") Boolean overdue);
    
    /**
     * 查询我创建的任务列表
     */
    IPage<TaskCenter> selectMyCreatedTasks(Page<TaskCenter> page,
                                          @Param("userId") String userId,
                                          @Param("status") String status,
                                          @Param("type") String type);
    
    /**
     * 查询候选任务列表（可认领的任务）
     */
    IPage<TaskCenter> selectCandidateTasks(Page<TaskCenter> page,
                                          @Param("userId") String userId,
                                          @Param("userGroups") List<String> userGroups,
                                          @Param("type") String type,
                                          @Param("priority") Integer priority);
    
    /**
     * 查询过期任务列表
     */
    IPage<TaskCenter> selectOverdueTasks(Page<TaskCenter> page,
                                        @Param("assigneeId") String assigneeId,
                                        @Param("type") String type);
    
    /**
     * 查询即将到期的任务列表
     */
    IPage<TaskCenter> selectUpcomingTasks(Page<TaskCenter> page,
                                         @Param("assigneeId") String assigneeId,
                                         @Param("hours") Integer hours);
    
    /**
     * 更新任务状态
     */
    int updateTaskStatus(@Param("id") String id,
                        @Param("status") String status,
                        @Param("updatedBy") String updatedBy,
                        @Param("updatedByName") String updatedByName);
    
    /**
     * 批量更新任务状态
     */
    int batchUpdateTaskStatus(@Param("ids") List<String> ids,
                             @Param("status") String status,
                             @Param("updatedBy") String updatedBy,
                             @Param("updatedByName") String updatedByName);
    
    /**
     * 分配任务
     */
    int assignTask(@Param("id") String id,
                  @Param("assigneeId") String assigneeId,
                  @Param("assigneeName") String assigneeName,
                  @Param("updatedBy") String updatedBy,
                  @Param("updatedByName") String updatedByName);
    
    /**
     * 批量分配任务
     */
    int batchAssignTask(@Param("ids") List<String> ids,
                       @Param("assigneeId") String assigneeId,
                       @Param("assigneeName") String assigneeName,
                       @Param("updatedBy") String updatedBy,
                       @Param("updatedByName") String updatedByName);
    
    /**
     * 完成任务
     */
    int completeTask(@Param("id") String id,
                    @Param("completedTime") LocalDateTime completedTime,
                    @Param("updatedBy") String updatedBy,
                    @Param("updatedByName") String updatedByName);
    
    /**
     * 更新任务优先级
     */
    int updateTaskPriority(@Param("id") String id,
                          @Param("priority") Integer priority,
                          @Param("updatedBy") String updatedBy,
                          @Param("updatedByName") String updatedByName);
    
    /**
     * 批量更新任务优先级
     */
    int batchUpdateTaskPriority(@Param("ids") List<String> ids,
                               @Param("priority") Integer priority,
                               @Param("updatedBy") String updatedBy,
                               @Param("updatedByName") String updatedByName);
    
    /**
     * 更新任务到期时间
     */
    int updateTaskDueTime(@Param("id") String id,
                         @Param("dueTime") LocalDateTime dueTime,
                         @Param("updatedBy") String updatedBy,
                         @Param("updatedByName") String updatedByName);
    
    /**
     * 批量更新任务到期时间
     */
    int batchUpdateTaskDueTime(@Param("ids") List<String> ids,
                              @Param("dueTime") LocalDateTime dueTime,
                              @Param("updatedBy") String updatedBy,
                              @Param("updatedByName") String updatedByName);
    
    /**
     * 更新任务标签
     */
    int updateTaskTags(@Param("id") String id,
                      @Param("tags") String tags,
                      @Param("updatedBy") String updatedBy,
                      @Param("updatedByName") String updatedByName);
    
    /**
     * 批量更新任务标签
     */
    int batchUpdateTaskTags(@Param("ids") List<String> ids,
                           @Param("tags") String tags,
                           @Param("updatedBy") String updatedBy,
                           @Param("updatedByName") String updatedByName);
    
    /**
     * 批量更新任务排序
     */
    int batchUpdateTaskSort(@Param("taskSorts") List<Map<String, Object>> taskSorts);
    
    /**
     * 根据流程实例ID删除任务
     */
    int deleteByProcessInstanceId(@Param("processInstanceId") String processInstanceId);
    
    /**
     * 根据表单ID删除任务
     */
    int deleteByFormId(@Param("formId") String formId);
    
    /**
     * 根据表单数据ID删除任务
     */
    int deleteByFormDataId(@Param("formDataId") String formDataId);
    
    /**
     * 检查业务键是否存在
     */
    int checkBusinessKeyExists(@Param("businessKey") String businessKey,
                              @Param("excludeId") String excludeId);
    
    /**
     * 获取任务统计信息
     */
    Map<String, Object> getTaskStatistics(@Param("assigneeId") String assigneeId);
    
    /**
     * 根据状态统计任务数量
     */
    List<Map<String, Object>> getTaskCountByStatus(@Param("assigneeId") String assigneeId);
    
    /**
     * 根据类型统计任务数量
     */
    List<Map<String, Object>> getTaskCountByType(@Param("assigneeId") String assigneeId,
                                                 @Param("limit") Integer limit);
    
    /**
     * 根据分类统计任务数量
     */
    List<Map<String, Object>> getTaskCountByCategory(@Param("assigneeId") String assigneeId,
                                                     @Param("limit") Integer limit);
    
    /**
     * 根据优先级统计任务数量
     */
    List<Map<String, Object>> getTaskCountByPriority(@Param("assigneeId") String assigneeId);
    
    /**
     * 根据创建人统计任务数量
     */
    List<Map<String, Object>> getTaskCountByCreator(@Param("limit") Integer limit);
    
    /**
     * 根据执行人统计任务数量
     */
    List<Map<String, Object>> getTaskCountByAssignee(@Param("limit") Integer limit);
    
    /**
     * 根据时间统计任务数量
     */
    List<Map<String, Object>> getTaskCountByDate(@Param("assigneeId") String assigneeId,
                                                 @Param("startDate") LocalDateTime startDate,
                                                 @Param("endDate") LocalDateTime endDate);
    
    /**
     * 根据时间统计任务数量（按月）
     */
    List<Map<String, Object>> getTaskCountByMonth(@Param("assigneeId") String assigneeId,
                                                  @Param("startDate") LocalDateTime startDate,
                                                  @Param("endDate") LocalDateTime endDate);
    
    /**
     * 获取任务完成率统计
     */
    Map<String, Object> getTaskCompletionRate(@Param("assigneeId") String assigneeId,
                                              @Param("startDate") LocalDateTime startDate,
                                              @Param("endDate") LocalDateTime endDate);
    
    /**
     * 获取任务平均处理时间
     */
    Map<String, Object> getTaskAverageProcessingTime(@Param("assigneeId") String assigneeId,
                                                     @Param("type") String type,
                                                     @Param("startDate") LocalDateTime startDate,
                                                     @Param("endDate") LocalDateTime endDate);
    
    /**
     * 获取过期任务统计
     */
    Map<String, Object> getOverdueTaskStatistics(@Param("assigneeId") String assigneeId);
    
    /**
     * 获取待处理任务数量
     */
    int getPendingTaskCount(@Param("assigneeId") String assigneeId);
    
    /**
     * 获取今日新增任务数量
     */
    int getTodayNewTaskCount(@Param("assigneeId") String assigneeId);
    
    /**
     * 获取今日完成任务数量
     */
    int getTodayCompletedTaskCount(@Param("assigneeId") String assigneeId);
    
    /**
     * 获取本周任务统计
     */
    Map<String, Object> getWeeklyTaskStatistics(@Param("assigneeId") String assigneeId);
    
    /**
     * 获取本月任务统计
     */
    Map<String, Object> getMonthlyTaskStatistics(@Param("assigneeId") String assigneeId);
    
    /**
     * 查询任务分类列表
     */
    List<String> getTaskCategories();
    
    /**
     * 查询任务类型列表
     */
    List<String> getTaskTypes();
    
    /**
     * 查询任务标签列表
     */
    List<String> getTaskTags(@Param("limit") Integer limit);
    
    /**
     * 获取最大排序值
     */
    Integer getMaxSort();
    
    /**
     * 根据外部ID查询任务
     */
    TaskCenter selectByExternalId(@Param("externalId") String externalId);
    
    /**
     * 更新任务版本
     */
    int updateTaskVersion(@Param("id") String id);
    
    /**
     * 查询相关任务列表
     */
    List<TaskCenter> selectRelatedTasks(@Param("businessKey") String businessKey,
                                       @Param("businessType") String businessType,
                                       @Param("excludeId") String excludeId);
    
    /**
     * 查询任务依赖关系
     */
    List<Map<String, Object>> getTaskDependencies(@Param("taskId") String taskId);
    
    /**
     * 查询子任务列表
     */
    List<TaskCenter> selectSubTasks(@Param("parentTaskId") String parentTaskId);
    
    /**
     * 查询父任务
     */
    TaskCenter selectParentTask(@Param("taskId") String taskId);
}